package network;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class TcpEchoClient {
    private Socket socket = null;
    public TcpEchoClient(String serverIP, int serverPort) throws IOException {
        //此处可以把这里的 ip 和 port 直接传给socket 对象。
        //由于tcp是有连接的，因此 socket里面就会保存好这俩信息。
        //因此此处 TcpEchoClient类就不必保存（可以和udp的代码进行对照，更好理解差别）
        socket = new Socket(serverIP,serverPort);
    }

    public void start() throws IOException {
        System.out.println("客户端启动！");

        try(InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream()){
            Scanner scannerConsole = new Scanner(System.in);
            Scanner scannerNetWork = new Scanner(inputStream);

            while (true){
                //这里的流程UDP的客户端类似。
                //1.从控制台读取输入的字符串
                System.out.print("->");
                if(!scannerConsole.hasNext()){
                    break;
                }
                String request = scannerConsole.next();

                //2.把请求发给服务器。这里需要使用 println 来发送，为了让发送的请求末尾带有 \n
                //  这里是和服务器的scanner.next 呼应的。
                PrintWriter writer = new PrintWriter(outputStream);
                //通过这个flush主动刷新缓冲区，确保数据真的发出去了
                writer.println(request);
                writer.flush();
                //3.从服务器读取响应。这里也是和服务器返回响应的逻辑对应。
                String response = scannerNetWork.next();
                //4.把响应显示出来
                System.out.println(response);
            }

        }


    }

    public static void main(String[] args) throws IOException {
        TcpEchoClient client = new TcpEchoClient("127.1.1.1",9090);
        client.start();
    }
}
